#include "../source/vlib.h"
#include <stdio.h>

static void test_create(void)
{
	stack_t stack = stack(int, 6);
	_stack(stack);
}

static void test_push_pop(void)
{
	stack_t stack = stack(int, 6);
	int data;
	
	for (int i = 0; i < 6; i++)
	{
		stack_push(stack, &i);
	}
	
	for (int i = 0; i < 6; i++)
	{
		if (stack_pop(stack, &data)) printf("pop %d\r\n", data);
	}
	
	_stack(stack);
}

static void test_at(void)
{
	stack_t stack = stack(int, 6);
	
	for (int i = 0; i < 6; i++)
	{
		stack_push(stack, &i);
	}
	
	for (int i = 0; i < 6; i++)
	{
		printf("stack[%d] = %d\r\n", i, stack_at(stack, int, i));
	}
	
	_stack(stack);
}

static void test_insert(void)
{
	stack_t stack = stack(int, 6);
	
	for (int i = 0; i < 4; i++)
	{
		stack_push(stack, &i);
	}
	stack_insert(stack, 1, la(int, 1024), STACK_ORGIN_BOTTOM);
	
	for (int i = 0; i < stack_size(stack); i++)
	{
		printf("stack[%d] = %d\r\n", i, stack_at(stack, int, i));
	}
	
	_stack(stack);
}

static void test_erase(void)
{
	stack_t stack = stack(int, 6);
	
	for (int i = 0; i < 4; i++)
	{
		stack_push(stack, &i);
	}
	stack_erase(stack, 1, 2, STACK_ORGIN_BOTTOM);
	
	for (int i = 0; i < stack_size(stack); i++)
	{
		printf("stack[%d] = %d\r\n", i, stack_at(stack, int, i));
	}
	
	_stack(stack);
}

static void test_capacity(void)
{
	stack_t stack = stack(int, 6);
	
	for (int i = 0; i < 4; i++)
	{
		stack_push(stack, &i);
	}
	
	printf("capacity = %d\r\n", stack_capacity(stack));
	for (int i = 0; i < stack_size(stack); i++)
	{
		printf("stack[%d] = %d\r\n", i, stack_at(stack, int, i));
	}
	
	printf("-------------------\r\n");
	
	stack_alter_capacity(stack, 8);
	printf("capacity = %d\r\n", stack_capacity(stack));
	
	stack_alter_capacity(stack, 3);
	printf("capacity = %d\r\n", stack_capacity(stack));
	
	for (int i = 0; i < stack_size(stack); i++)
	{
		printf("stack[%d] = %d\r\n", i, stack_at(stack, int, i));
	}
	
	_stack(stack);
}

static void test_mode(void)
{
	stack_t stack = stack(int, 4);
	
	for (int i = 0; i < 4; i++)
	{
		stack_push(stack, &i);
	}
	
	for (int i = 0; i < stack_size(stack); i++)
	{
		printf("stack[%d] = %d\r\n", i, stack_at(stack, int, i));
	}
	
	printf("push result: %d\r\n", stack_push(stack, la(int, 100)));
	printf("push result: %d\r\n", stack_push(stack, la(int, 1000)));
	
	stack_mode(stack, STACK_MODE_OVERWRITE, STACK_SET_MODE);
	
	printf("push result: %d\r\n", stack_push(stack, la(int, 100)));
	printf("push result: %d\r\n", stack_push(stack, la(int, 1000)));
	
	for (int i = 0; i < stack_size(stack); i++)
	{
		printf("stack[%d] = %d\r\n", i, stack_at(stack, int, i));
	}
	
	_stack(stack);
}

static void test_init(void)
{
	STACK S;
	int array[10];

	stack_init(&S, array, sizeof(int), sizeof(array)/sizeof(array[0]));
	stack_deinit(&S);
}

void test_stack(void)
{
    // test_create();
	// test_push_pop();
	// test_at();
	// test_insert();
	// test_erase();
	// test_capacity();
	test_mode();
	// test_init();
}